/*
 * commons is a based project implemented
 * Copyright (C) 2024 Jasmine
 */
package com.easy.web.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory;

import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;

/**
 * 校验模式 Hibernate Validator有两种校验模式： 普通模式（默认）：校验完所有属性，返回验证失败的信息 快速失败返回模式：只要有一个验证失败则立即返回
 *
 * @author Jasmine
 * @since 1.0.0
 */
@Configuration
public class ValidatedConfig {

    /**
     * 配置快速失败 Spring Validation默认会校验完所有字段，然后才抛出异常。可以通过一些简单的配置，开启Fali Fast模式，一旦校验失败就立即返回。
     */
    @Bean
    public Validator validator(AutowireCapableBeanFactory beanFactory) {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()
            // true：快速失败返回模式 false：普通模式
            .failFast(true)
            // 解决自定义校验器 使用bean问题
            .constraintValidatorFactory(new SpringConstraintValidatorFactory(beanFactory)).buildValidatorFactory();
        try (validatorFactory) {
            return validatorFactory.getValidator();
        }
    }
}
